梯度(gradient)
的這個概念對我這個初學來說並不是很容易就能理解,在物理上梯度可以理解成在做一個空間中純量場的數學運算,用來了解純量場隨空間的變化,而數學中我們從梯度下降演算法中可以幫助我們找到函數的極小值.之所以會將梯度下降演算法用在機器學習與深度學習的相關利用中求函數的極小值,主要是因為它能夠透過找近似解的方式去逼近極值.說到找極值的問題,相信不少人都會想到數學上可以利用微分的方式去找,但實際應用與微積分的考試當然不同不會那麼剛好可以找到唯一解的.
前幾天我主要是對張量做了很概略的介紹,PyTorch中的張量會記住自己是如何生成的,即產生張量的運算以及母張量為何,並且提供運算對其輸入變數的連鎖導數.也就是我們不必寫出完整的微分式,無論模型的複雜度多高,PyTorch都能自動的幫我們計算參數的梯度.
In:
import torch
from torch.autograd import Variable
tensor = torch.FloatTensor([[1,2,3],[4,5,6]])
variable = Variable(tensor, requires_grad=True)
Out:
tensor([[1., 2., 3.],
[4., 5., 6.]])
tensor([[1., 2., 3.],
[4., 5., 6.]], requires_grad=True)
requires_grad 這個設定主要是參不參與反向傳播
.
In:
t_out = torch.mean(tensor*tensor*tensor) # x^3
v_out = torch.mean(variable*variable*variable) # x^3
print(t_out)
print(v_out)
Out:
tensor(73.5000)
tensor(73.5000, grad_fn=<MeanBackward0>)
到這裡為止的tensor與variable看不出有何不同.但事實上變數計算時,PyTorch中autograd的底層採用了計算圖,計算圖是用於紀錄運算子與變數之間的關係,一般用矩形表示運算子,橢圓形表示變數
.
圖片來源:https://www.qikegu.com/docs/4201
In:
v_out.backward()
print(variable.grad)
Out:
tensor([[ 0.5000, 2.0000, 4.5000],
[ 8.0000, 12.5000, 18.0000]])